package com.itheima.admin.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.admin.pojo.AdUser;
import com.itheima.admin.mapper.AdUserMapper;
import com.itheima.admin.service.AdUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.common.constants.SystemConstants;
import com.itheima.common.dto.LoginUserDto;
import com.itheima.common.exception.LeadNewsException;
import com.itheima.common.util.AppJwtUtil;
import com.itheima.common.vo.LoginUserVo;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import javax.validation.constraints.NotEmpty;

/**
 * @description <p>管理员用户信息 业务实现</p>
 *
 * @version 1.0
 * @package com.itheima.admin.service.impl
 */
@Service
public class AdUserServiceImpl extends ServiceImpl<AdUserMapper, AdUser> implements AdUserService {

    /**
     * 登录校验
     *
     * @param dto
     * @return
     */
    @Override
    public LoginUserVo loginCheck(LoginUserDto dto) {
        //1. 获取请求参数
        String name = dto.getName();
        String password = dto.getPassword();
        //2. 通过用户名查询用户信息
        AdUser adUser = query().eq("name", name).one(); // 相等下面三行代码
        /*LambdaQueryWrapper<AdUser> lqw = new LambdaQueryWrapper<>();
        lqw.eq(AdUser::getName, name);
        AdUser adUser = getBaseMapper().selectOne(lqw);*/
        //3. 如果用户不存在，则报错
        if(null == adUser){
            throw new LeadNewsException("用户名或密码不正确!");
        }
        // 状态的状态
        if (adUser.getStatus() != 9) {
            // 帐号被禁了
            throw new LeadNewsException("该帐号已被禁止使用，请联系管理员!");
        }
        //4. 用户存在，则要进行密码校验
        //4.1 把前端的密码进行加盐加密处理
        password = password + adUser.getSalt(); // 加上盐
        // MD5加密
        String encryptedPwd = DigestUtils.md5DigestAsHex(password.getBytes());
        //4.2 再与数据库的密码进行比较
        //【注意】字符串的比较必须使用equals，不能使用== ，代表对比的是地址
        if(!encryptedPwd.equals(adUser.getPassword())) {
            //4.3 如果不一样则报错
            throw new LeadNewsException("用户名或密码不正确!");
        }
        //5. 相同，则生成token
        String token = AppJwtUtil.createToken(adUser.getId());
        //6. 返回的用户信息中要脱敏(把敏感数据删除，或置为空值)
        adUser.setSalt(null);
        adUser.setPassword(null);
        //7. 构建结果返回
        LoginUserVo vo = new LoginUserVo();
        vo.setToken(token);
        vo.setUser(adUser);
        return vo;
    }
}
